//----------------------------------------------------------------------筛法
#define N 1024
//niubee linear sevie method
//N+1是必须的~
int phi[N+1],//欧拉函数
    p[N+1],//素数表
    ld[N+1],//最小素因子
    ldt[N+1],//最小素因子的次数
    min_pk[N+1],//if p==ld[n],min_pk[n]=1+p+p^2+...+p^ldt[n];
    sig[N+1],//约数和
    nd[N+1];//因子数
//依赖性:min_pk<-sig;ldt<-nd;
void sevie()
{
	memset(p,0,sizeof(p));
	int i,j;

	phi[0]=0;phi[1]=1;//phi
	ld[0]=0;ld[1]=1;//ld
	ldt[0]=0;ldt[1]=1;//ldt
	min_pk[0]=0;min_pk[1]=1;//min_pk
	sig[0]=0;sig[1]=1;//sig
	nd[0]=0;nd[1]=1;//nd
	for(i=2;i<=N;i++)
	{
		if(!p[i]){
			p[++p[0]]=i;
			phi[i]=i-1;
			ld[i]=i;
			ldt[i]=1;
			min_pk[i]=i+1;
			sig[i]=i+1;
			nd[i]=2;
		}
		for(j=1;p[j]<=N/i;j++)
		{
			p[p[j]*i]=1;
			ld[p[j]*i]=p[j];
			if(i%p[j]){
				phi[p[j]*i]=phi[p[j]]*phi[i];
				ldt[p[j]*i]=1;
				min_pk[p[j]*i]=p[j]+1;
				sig[p[j]*i]=sig[i]*sig[p[j]];
				nd[p[j]*i]=nd[p[j]]*nd[i];
			}
			else{
				phi[p[j]*i]=phi[i]*p[j];
				ldt[p[j]*i]=ldt[i]+1;
				min_pk[p[j]*i]=p[j]*min_pk[i]+1;
				sig[p[j]*i]=sig[i]/min_pk[i]*min_pk[p[j]*i];
				nd[p[j]*i]=nd[i]/(ldt[i]+1)*(ldt[p[j]*i]+1);
				break;
			}
		}
	}
}

